package com.zqll.gdx.starter.assets.utils;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.Align;

/**
 * 文本工具类
 * 提供静态方法进行文本测量和渲染
 */
public class TextUtils {
    
    private static final GlyphLayout layout = new GlyphLayout();
    
    /**
     * 测量文本尺寸
     * @param font 字体
     * @param text 文本内容
     * @return 文本布局信息
     */
    public static GlyphLayout measureText(BitmapFont font, String text) {
        layout.setText(font, text);
        return layout;
    }
    
    /**
     * 获取文本宽度
     * @param font 字体
     * @param text 文本内容
     * @return 文本宽度
     */
    public static float getTextWidth(BitmapFont font, String text) {
        layout.setText(font, text);
        return layout.width;
    }
    
    /**
     * 获取文本高度
     * @param font 字体
     * @param text 文本内容
     * @return 文本高度
     */
    public static float getTextHeight(BitmapFont font, String text) {
        layout.setText(font, text);
        return layout.height;
    }
    
    /**
     * 在指定宽度内测量文本，支持换行
     * @param font 字体
     * @param text 文本内容
     * @param targetWidth 目标宽度
     * @param wrap 是否换行
     * @return 文本布局信息
     */
    public static GlyphLayout measureText(BitmapFont font, String text, float targetWidth, boolean wrap) {
        layout.setText(font, text, Color.WHITE, targetWidth, Align.left, wrap);
        return layout;
    }
    
    /**
     * 计算在指定宽度内能容纳的文本行数
     * @param font 字体
     * @param text 文本内容
     * @param targetWidth 目标宽度
     * @return 行数
     */
    public static int getLineCount(BitmapFont font, String text, float targetWidth) {
        layout.setText(font, text, Color.WHITE, targetWidth, Align.left, true);
        return layout.runs.size;
    }
    
    /**
     * 绘制带颜色的文本
     * @param batch SpriteBatch
     * @param font 字体
     * @param text 文本内容
     * @param x X坐标
     * @param y Y坐标
     * @param color 文本颜色
     */
    public static void drawText(SpriteBatch batch, BitmapFont font, String text, float x, float y, Color color) {
        Color oldColor = font.getColor().cpy();
        font.setColor(color);
        font.draw(batch, text, x, y);
        font.setColor(oldColor);
    }
    
    /**
     * 在指定区域内绘制文本，支持对齐和换行
     * @param batch SpriteBatch
     * @param font 字体
     * @param text 文本内容
     * @param x X坐标
     * @param y Y坐标
     * @param targetWidth 目标宽度
     * @param halign 水平对齐方式
     * @param wrap 是否自动换行
     */
    public static void drawText(SpriteBatch batch, BitmapFont font, String text, float x, float y, 
                               float targetWidth, int halign, boolean wrap) {
        font.draw(batch, text, x, y, targetWidth, halign, wrap);
    }
    
    /**
     * 绘制居中文本
     * @param batch SpriteBatch
     * @param font 字体
     * @param text 文本内容
     * @param centerX 中心X坐标
     * @param centerY 中心Y坐标
     */
    public static void drawCenteredText(SpriteBatch batch, BitmapFont font, String text, float centerX, float centerY) {
        layout.setText(font, text);
        float x = centerX - layout.width / 2;
        float y = centerY + layout.height / 2;
        font.draw(batch, text, x, y);
    }
    
    /**
     * 检查文本是否包含中文字符
     * @param text 文本内容
     * @return 是否包含中文字符
     */
    public static boolean containsChinese(String text) {
        if (text == null || text.isEmpty()) {
            return false;
        }
        
        for (char c : text.toCharArray()) {
            if (isChinese(c)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 检查字符是否为中文字符
     * @param c 字符
     * @return 是否为中文字符
     */
    public static boolean isChinese(char c) {
        // 基本汉字范围
        return (c >= 0x4E00 && c <= 0x9FFF) ||
               // 中文标点符号
               (c >= 0x3000 && c <= 0x303F) ||
               // 全角字符
               (c >= 0xFF00 && c <= 0xFF60);
    }
    
    /**
     * 提取文本中的唯一字符
     * @param text 文本内容
     * @return 唯一字符字符串
     */
    public static String extractUniqueChars(String text) {
        if (text == null || text.isEmpty()) {
            return "";
        }
        
        StringBuilder uniqueChars = new StringBuilder();
        for (char c : text.toCharArray()) {
            if (uniqueChars.indexOf(String.valueOf(c)) == -1) {
                uniqueChars.append(c);
            }
        }
        return uniqueChars.toString();
    }
}